package com.itheima.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;

import java.util.Date;
import java.util.Map;

/**
 * @Description: JwtUtils 工具类
 * @Date :2019-08-17 09:01
 * @Author : yuan_he_song
 */
@Data
public class JwtUtils {

    /** 签名失效时长 */
    @Value("${jwt.ttl}")
    private long ttl ;

    /** 签名秘钥 */
    @Value("${jwt.screKey}")
    private String screKey ;

    /**
     * 创建认证token
     * id 用户id
     * subject 用户名
     */
    public  String createToken(String id, String name, Map<String,Object> map){
        /** 设置失效时间 */
        long now = System.currentTimeMillis();
        long expire = now + ttl;

        /** 创建 JwtBuilder */
        JwtBuilder jwtBuilder = Jwts.builder()
                .setId(id) // 用户id
                .setSubject(name) // 用户名
                .setIssuedAt(new Date(now)) // 签发时间
                .signWith(SignatureAlgorithm.HS256, screKey);
        jwtBuilder.setExpiration(new Date(expire));

        /**  根据map设置自定义内容claims */
        if(map != null && !map.isEmpty()){
            for (Map.Entry<String,Object> entry : map.entrySet()){
                jwtBuilder.claim(entry.getKey(),entry.getValue());
            }
        }

        /** 创建token */
        String token = jwtBuilder.compact();
        return token;
    }

    /**
     * 解析token
     * @param token
     * @return Claims
     */
    public Claims parseToken(String token){
        Claims claims = Jwts.parser()
                .setSigningKey(screKey)
                .parseClaimsJws(token).getBody();
        return claims;
    }
}
